#include "Verification.h"



int rechercheMax( const int * tab, const int size)
{
   int i;
   int max = tab[0];

   for (i=1; i<size; i++)
   {
      if(tab[i]>max) max=tab[i];
   }
   return max;
}

int rechercheMin(const  int * tab, const int size)
{
   int i;
   int min = tab[0];

   for (i=1; i<size; i++)
   {
      if(tab[i]<min) min=tab[i];
   }
   return min;
}

 int verifFormeMot(const int *x,const int *y,const int tailleTab,const Terrain * pTer)
{
    int i,res=0;

    /* Cas particulier: le joueur pose une seule lettre: on ne peut donc pas savoir si le mot est vertical ou pas */
    if(tailleTab==1)
    { /* Remarque: vérification simplifiée */
        /* on vérifie le cas particulier des bords */
        if(x[0]==1)
         {
             if(terGetXY(pTer,x[0]+1,y[0])!='.' && terGetXY(pTer,x[0]+1,y[0])!='_' )
             return 2;
             else return 1;
         }

         else if(x[0]==9)
         {
             if(terGetXY(pTer,x[0]-1,y[0])!='.' && terGetXY(pTer,x[0]-1,y[0])!='_' )
             return 2;
             else return 1;
         }
         else
         {
             if(terGetXY(pTer,x[0]+1,y[0])!='.' && terGetXY(pTer,x[0]+1,y[0])!='_' )
             return 2;

             else if (terGetXY(pTer,x[0]-1,y[0])!='.' && terGetXY(pTer,x[0]-1,y[0])!='_' )
             return 2;

             else return 1;
         }

    }
    else
    {

        for(i=0;i<tailleTab-1;i++)
        {
            if(x[i]==x[i+1]) {res=1;}
            else { res=0; i=6;}

        }
        if(res==0)
        {
             for(i=0;i<tailleTab-1;i++)
        {
            if(y[i]==y[i+1] && terGetXY(pTer,x[i]+1,y[i])!='.') {res=2;}
            else { res=0; i=6;}

        }

        }

        if(res==1)
        {
            for(i=rechercheMin(y,tailleTab);i<rechercheMax(y,tailleTab); i++)
            {
                if(terGetXY(pTer,x[0],i)=='.' || terGetXY(pTer,x[0],i)=='*') res=0;
            }
        }

        else if(res==2)
        {
            for(i=rechercheMin(x,tailleTab);i<rechercheMax(x,tailleTab); i++)
            {
                if(terGetXY(pTer,i,y[0])=='.' || terGetXY(pTer,i,y[0])=='*') res=0;
            }
        }

        return res;
    }
}

int verifJoueEtoile(const int *x, const int *y, const int tailleTab)
{
    int i, res;
    res=0;
    for(i=0;i<tailleTab;i++)
    {
        if(x[i]==5 && y[i]==5)
            res=1;

    }
    return res;
}



int verifMotRaccorde(const Terrain * pTer,const int *x,const  int *y,const int tailleTab)
{
    int i;
    unsigned int res;

    res=0;
for(i=0;i<tailleTab;i++){

 if (x[i]==1)
    {
    if (y[i]==1)
    {
    if (terGetXY(pTer,x[i]+1,y[i])!='.' && terGetXY(pTer,x[i]+1,y[i])<97)
    res=1;
    else if (terGetXY(pTer,x[i],y[i]+1)!='.' && terGetXY(pTer,x[i],y[i]+1)<97)
    res=1;
    }
    else if (y[i]==9)
    {
        if (terGetXY(pTer,x[i]+1,y[i])!='.' && terGetXY(pTer,x[i]+1,y[i])<97)
        res=1;
        else if (terGetXY(pTer,x[i],y[i]-1)!='.' && terGetXY(pTer,x[i],y[i]-1)<97)
        res=1;
    }
    else
    {
        if (terGetXY(pTer,x[i]+1,y[i])!='.' && terGetXY(pTer,x[i]+1,y[i])<97)
        res=1;
        else if (terGetXY(pTer,x[i],y[i]-1)!='.' && terGetXY(pTer,x[i],y[i]-1)<97)
        res=1;
        else if (terGetXY(pTer,x[i],y[i]+1)!='.' && terGetXY(pTer,x[i],y[i]+1)<97)
        res=1;
    }
 }

else if (x[i]==9)
    {
        if (y[i]==1)
        {
            if (terGetXY(pTer,x[i]-1,y[i])!='.' && terGetXY(pTer,x[i]-1,y[i])<97)
            res=1;
            else if (terGetXY(pTer,x[i],y[i]-1)!='.' && terGetXY(pTer,x[i],y[i]-1)<97)
            res=1;
        }
        else if (y[i]==9)
        {
            if (terGetXY(pTer,x[i]-1,y[i])!='.' && terGetXY(pTer,x[i]-1,y[i])<97)
            res=1;
            else if (terGetXY(pTer,x[i],y[i]+1)!='.' && terGetXY(pTer,x[i],y[i]+1)<97)
            res=1;
        }
        else
        {
         if (terGetXY(pTer,x[i]-1,y[i])!='.' && terGetXY(pTer,x[i]-1,y[i])<97)
            res=1;
            else if (terGetXY(pTer,x[i],y[i]-1)!='.' && terGetXY(pTer,x[i],y[i]-1)<97)
            res=1;
            else if (terGetXY(pTer,x[i],y[i]+1)!='.' && terGetXY(pTer,x[i],y[i]+1)<97)
            res=1;
        }
    }

else if (y[i]==1)
    {
        if (terGetXY(pTer,x[i]+1,y[i])!='.' && terGetXY(pTer,x[i]+1,y[i])<97)
        res=1;
        else if (terGetXY(pTer,x[i]-1,y[i])!='.' && terGetXY(pTer,x[i]-1,y[i])<97)
        res=1;
        else if (terGetXY(pTer,x[i],y[i]+1)!='.' && terGetXY(pTer,x[i],y[i]+1)<97)
        res=1;
    }
else if (y[i]==9)
    {
        if (terGetXY(pTer,x[i]+1,y[i])!='.' && terGetXY(pTer,x[i]+1,y[i])<97)
        res=1;
        else if (terGetXY(pTer,x[i]-1,y[i])!='.' && terGetXY(pTer,x[i]-1,y[i])<97)
        res=1;
        else if (terGetXY(pTer,x[i],y[i]-1)!='.' && terGetXY(pTer,x[i],y[i]-1)<97)
        res=1;
    }


else
    {
        if (terGetXY(pTer,x[i]+1,y[i])!='.' && terGetXY(pTer,x[i]+1,y[i])<97)
        res=1;
        else if (terGetXY(pTer,x[i]-1,y[i])!='.' && terGetXY(pTer,x[i]-1,y[i])<97)
        res=1;
        else if (terGetXY(pTer,x[i],y[i]-1)!='.' && terGetXY(pTer,x[i],y[i]-1)<97)
        res=1;
        else if (terGetXY(pTer,x[i],y[i]+1)!='.' && terGetXY(pTer,x[i],y[i]+1)<97)
        res=1;
    }
}
return res;
}

unsigned int caseVortex(const int *x,const int *y,const int taille)
{
    int i;
    for(i=0;i<taille;i++)
    {
        if(x[i]==1 || x[i]==9)
        {
            if(y[i]==1 || y[i]==9)
            return 1;
        }
    }
    return 0;
}

unsigned int verifMotDico(const int *x, const int *y,const int res_formeMot,const Terrain * pTer, const int taille)
{
    unsigned int min,max,tailleMot,res,i;
    FILE* dico;
    char cheminFichier[20],premiereLettreMot,*motFichier,*motJoueur;

    res=0;
    dico = NULL;
    tailleMot=0;
    motFichier=NULL;
    motJoueur=NULL;


    /*si notre mot est écrit à l'horizontal*/
    if(res_formeMot==1)
    /* on vérifie sa longueur totale*/
     {
         /* on commence par chercher où le joueur a posé des lettres*/
         min=rechercheMin(y,taille);
         max=rechercheMax(y,taille);
         /* on regarde si il y en avait (des lettres) avant */
         while(terGetXY(pTer,x[0],min-1)!='.'&& terGetXY(pTer,x[0],min-1)!='_' && min!=1) {min--;}
         /* on regarde si il y a des lettres après celles jouées */
         while(terGetXY(pTer,x[0],max+1)!='.' && terGetXY(pTer,x[0],max+1)!='_' && max!=9) {max++;}

         premiereLettreMot=terGetXY(pTer,x[0],min);

     }

   /*si notre mot est écrit à la vertical*/
    if(res_formeMot==2)
    /* on vérifie sa longueur totale*/
     {
         /* on commence par chercher où le joueur a posé des lettres*/
         min=rechercheMin(x,taille);
         max=rechercheMax(x,taille);
         /* on regarde si il y en avait (des lettres) avant */
         while(terGetXY(pTer,min-1,y[0])!='.' && terGetXY(pTer,min-1,y[0])!='_' && min!=1) {min--;}
         /* on regarde si il y a des lettres après celles jouées */
         while(terGetXY(pTer,max+1,y[0])!='.' && terGetXY(pTer,max+1,y[0])!='_'  && max!=9) {max++;}

         premiereLettreMot=terGetXY(pTer,min,y[0]);

     }

        tailleMot=max-min+1;

        if(premiereLettreMot<=97) premiereLettreMot=premiereLettreMot+32;

        /* Chargement du dictionnaire*/

        strcpy(cheminFichier,"data/dico/2/a.txt");
        cheminFichier[10]=tailleMot+48;
        cheminFichier[12]=premiereLettreMot;
        dico=fopen(cheminFichier,"r");

      if(dico==NULL)
      {
          strcpy(cheminFichier,"../data/dico/2/a.txt");
          cheminFichier[13]=tailleMot+48;
          cheminFichier[15]=premiereLettreMot;
          dico=fopen(cheminFichier,"r");
      }
      assert(dico!=NULL);

      /*Reforme le mot entier*/
      motJoueur=(char *) calloc(sizeof(char),tailleMot+1);
      motFichier=(char *) calloc(sizeof(char),tailleMot+1);


      for(i=0;i<tailleMot;i++)
      {
          if(res_formeMot==1)
            {
                if(terGetXY(pTer,x[0],min+i)>=97) motJoueur[i]=terGetXY(pTer,x[0],min+i)-32;
                else motJoueur[i]=terGetXY(pTer,x[0],min+i);
            }
          else
           { if(terGetXY(pTer,min+i,y[0])>=97) motJoueur[i]=terGetXY(pTer,min+i,y[0])-32;
             else motJoueur[i]=terGetXY(pTer,min+i,y[0]);
           }
      }

    /*Recherche mot dans le fichier du dictionnaire */

      while(fgets(motFichier, tailleMot+1, dico) != NULL && res==0)
      {
          if(strcmp(motFichier,motJoueur)==0) res=1;
      }

free(motJoueur);
free(motFichier);
fclose(dico);

return res;

}
